 /*******************************************************************************
  * Copyright (c) 2004, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.cheatsheets;

 import java.net.URL ;

 import org.eclipse.help.ui.internal.views.HelpTray;
 import org.eclipse.help.ui.internal.views.IHelpPartPage;
 import org.eclipse.help.ui.internal.views.ReusableHelpPart;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.dialogs.TrayDialog;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetElement;
 import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetRegistryReader;
 import org.eclipse.ui.internal.cheatsheets.state.DefaultStateManager;
 import org.eclipse.ui.internal.cheatsheets.views.CheatSheetHelpPart;
 import org.eclipse.ui.internal.cheatsheets.views.CheatSheetView;
 import org.eclipse.ui.internal.cheatsheets.views.ViewUtilities;

 /**
  * Action for opening a cheat sheet. The cheat sheet can be specified
  * either by a cheat sheet id or by a URL of a cheat sheet content file.
  * <p>
  * This class is not intended to be subclassed by clients.
  * </p>
  *
  * @since 3.0
  */
 public final class OpenCheatSheetAction extends Action {
     private String id;
     private String name;
     private URL url;
     private String xml;
     private String basePath;

     /**
      * Creates an action that opens the cheat sheet with the given id.
      * The cheat sheet content file is located via the
      * <code>org.eclipse.ui.cheatsheets.cheatSheetContent</code>
      * extension point.
      *
      * @param id the cheat sheet id
      * @exception IllegalArgumentException if <code>id</code>
      * is <code>null</code>
      */
     public OpenCheatSheetAction(String id) {
         if (id == null) {
             throw new IllegalArgumentException ();
         }
         this.id = id;
     }
     
     /**
      * Creates an action that opens the cheat sheet with the
      * given cheat sheet content file.
      *
      * @param id the id to give this cheat sheet
      * @param name the name to give this cheat sheet
      * @param url URL of the cheat sheet content file
      * @exception IllegalArgumentException if the parameters
      * are <code>null</code>
      */
     public OpenCheatSheetAction(String id, String name, URL url) {
         if (id == null || name == null || url == null) {
             throw new IllegalArgumentException ();
         }
         this.id = id;
         this.name = name;
         this.url = url;
     }
     
     /**
      * Creates an action that opens a cheat sheet using
      * XML passed in as a string.
      *
      * @param id the id to give this cheat sheet
      * @param name the name to give this cheat sheet
      * @param xml the cheatsheet content in xml format
      * @param baseURL is a URL which is only required if the cheat sheet is
      * a composite cheat sheet which has tasks which use path parameters in which
      * case the paths will be relative to baseURL. May be <code>null</code>
      * if this is not a composite cheat sheet
      * @exception IllegalArgumentException if the parameters
      * are <code>null</code>
      * @since 3.3
      */
     public OpenCheatSheetAction(String id, String name, String xml, URL baseURL) {
         if (id == null || name == null || xml == null) {
             throw new IllegalArgumentException ();
         }
         this.id = id;
         this.name = name;
         this.xml = xml;
         if (baseURL !=null) {
             basePath = baseURL.toExternalForm();
         }
     }


     /* (non-javadoc)
      * This action will try to launch the cheat sheet view and populate
      * it with the content specified either in the URL or the content
      * file specified in the cheatsheetContent extension point
      * for the cheat sheet with the id passed to this action.
      * @see IAction#run()
      */
     public void run() {
         Shell shell = Display.getDefault().getActiveShell();
         Object data = shell.getData();
         // are we in a dialog that can show a cheat sheet?
 if (!shell.isFocusControl() && data instanceof TrayDialog) {
             TrayDialog dialog = (TrayDialog)data;
             HelpTray tray = (HelpTray)dialog.getTray();
             if (tray == null) {
                 tray = new HelpTray();
                 dialog.openTray(tray);
             }
             ReusableHelpPart helpPart = tray.getHelpPart();
             IHelpPartPage page = helpPart.createPage(CheatSheetHelpPart.ID, null, null);
             page.setVerticalSpacing(0);
             page.setHorizontalMargin(0);
             CheatSheetElement contentElement = CheatSheetRegistryReader.getInstance().findCheatSheet(id);
             helpPart.addPart(CheatSheetHelpPart.ID, new CheatSheetHelpPart(helpPart.getForm().getForm().getBody(), helpPart.getForm().getToolkit(), page.getToolBarManager(), contentElement, new DefaultStateManager()));
             page.addPart(CheatSheetHelpPart.ID, true);
             helpPart.addPage(page);
             helpPart.showPage(CheatSheetHelpPart.ID);
         }
         else {
             CheatSheetView view = ViewUtilities.showCheatSheetView();
             if (view == null) {
                 return;
             }
             // Depending on which constructor was used open the cheat sheet view from a
 // URL, an XML string or based on the id
 if(url != null) {
                 view.setInput(id, name, url);
             } else if (xml != null) {
                 view.setInputFromXml(id, name, xml, basePath);
             } else {
                 view.setInput(id);
             }
             IWorkbenchPage page = view.getSite().getWorkbenchWindow().getActivePage();
             page.bringToTop(view);
         }
     }
 }

